package menus;

import herramientas.BitUtil;
import bitclub.Alquiler;
import bitclub.ArticuloAlquilado;
import bitclub.Cliente;
import bitclub.Movimiento;
import java.util.Date;
import java.util.List;

/**
 * @author BIT COMPANY
 */
public class OpcionesClientes {

    /**
     * Crea un objeto cliente pidiendo sus atributos y llamando al constructor
     * y después le da de alta en la base de datos (BUENO, TODAVÍA NO!)
     */
    public static Cliente opcionClientesDarAlta() {
        Cliente cliente;
        BitUtil.borra();

        //Cogemos todos los datos uno a uno
        System.out.println("NUEVO CLIENTE");
        System.out.println("____________________");
        String nombre = BitUtil.dameCadenaNoVacio("Nombre: ", 20);
        String apellidos = BitUtil.dameCadenaNoVacio("Apellidos: ", 30);
        String dni = BitUtil.dameEnteroFijoNoVacio("DNI: ", 8);
        String mail = BitUtil.dameCadena("E-mail: ", 40);
        String telFijo = BitUtil.dameEnteroFijo("Tel. Fijo: ", 9);
        String telMovil = BitUtil.dameEnteroFijo("Tel. Movil: ", 9);
        String direccion = BitUtil.dameCadenaNoVacio("Dirección: ", 50);
        String cp = BitUtil.dameCadena("Codigo postal: ", 5);
        String localidad = BitUtil.dameCadenaNoVacio("Localidad: ", 30);
        Date fechaNacimiento = BitUtil.dameFechaNoVacio("Fecha nacimiento (dia/Mes/año): ");
        char sexo = BitUtil.dameSexo("Sexo: (Hombre/Mujer): ");
        Date fechaAlta = new Date();
        String password = BitUtil.dameCadenaNoVacio("Password: ", 10);
        double saldo;
        do {
            saldo = BitUtil.dameDouble("Ingresar: ");
            if (saldo < 0) {
                System.out.println("Debe ser una cantidad positiva.");
            }
        } while (saldo < 0);

        //Creamos el cliente con todos los datos recopilados
        cliente = new Cliente(nombre, apellidos, dni, true, mail, telFijo, telMovil, direccion, cp, localidad, fechaNacimiento, sexo, fechaAlta, null, password, saldo);

        //Borramos pantalla, mostramos el cliente completo y pedimos confirmación
        BitUtil.borra();
        System.out.println(cliente.toString());
        boolean confirmado = BitUtil.dameConfirmacion("Dar de alta este cliente? (s/n) ");

        //Si confirmamos pedimos al objeto que se guarde y si no lo descartamos
        if (confirmado) {
            cliente.nuevo();
            if (saldo > 0) {
                String concepto = cliente.getNombre() + " " + cliente.getApellidos() + " Recarga monedero: " + saldo;
                Movimiento movimiento = new Movimiento(concepto, fechaAlta, 0);
                movimiento.nuevo();
            }
            //Si almacenamos un cliente con saldo acordarse de crear un movimiento para la caja.
            return cliente;
        } else {
            return null;
        }

    }

    /**
     * Ver datos de un cliente
     * @param cliente 
     */
    public static void opcionClientesVer(Cliente cliente) {
        BitUtil.borra();
        System.out.println(cliente.toString());
        BitUtil.esperaEnter();
    }

    /**
     * Para editar un cliente
     */
    public static Cliente opcionClientesEditar(Cliente cliente) {
        int respuesta = 0;
        boolean algunCambio = false;


        Cliente copia = new Cliente(cliente.getNombre(), cliente.getApellidos(), cliente.getDni(), cliente.isActivo(),
                cliente.getMail(), cliente.getTel_fijo(), cliente.getTel_movil(), cliente.getDireccion(),
                cliente.getCodigoPostal(), cliente.getLocalidad(), cliente.getNacimiento(),
                cliente.getSexo(), cliente.getFechaAlta(), cliente.getFechaBaja(), cliente.getPassword(),
                cliente.getSaldo(), cliente.getId());

        do {
            BitUtil.borra();
            respuesta = BitUtil.muestraMenu("EDITAR CLIENTE", new String[]{"Nombre", "Apellidos", "DNI", "Email", "Telefono Fijo", "Telefono Movil", "Dirección", "Codigo Postal", "Localidad", "Fecha de Nacimiento", "Sexo", "Fecha de Alta", "Password"});
            System.out.println("\n");
            switch (respuesta) {
                case 1:
                    System.out.println("Nombre: " + cliente.getNombre());
                    cliente.setNombre(BitUtil.dameCadenaNoVacio("Nuevo Nombre: ", 20));
                    algunCambio = true;
                    break;
                case 2:
                    System.out.println("Apellidos: " + cliente.getApellidos());
                    cliente.setApellidos(BitUtil.dameCadenaNoVacio("Nuevo Apellidos: ", 30));
                    algunCambio = true;
                    break;
                case 3:
                    System.out.println("DNI: " + cliente.getDni());
                    cliente.setDni(BitUtil.dameEnteroFijoNoVacio("Nuevo DNI: ", 8));
                    algunCambio = true;
                    break;
                case 4:
                    System.out.println("Email: " + cliente.getMail());
                    cliente.setMail(BitUtil.dameCadena("Nuevo E-mail: ", 40));
                    algunCambio = true;
                    break;
                case 5:
                    System.out.println("Telefono Fijo: " + cliente.getTel_fijo());
                    cliente.setTel_fijo(BitUtil.dameEnteroFijo("Nuevo Tel. Fijo: ", 9));
                    algunCambio = true;
                    break;
                case 6:
                    System.out.println("Telefono Movil: " + cliente.getTel_movil());
                    cliente.setTel_movil(BitUtil.dameEnteroFijo("Nuevo Tel. Movil: ", 9));
                    algunCambio = true;
                    break;
                case 7:
                    System.out.println("Direccion: " + cliente.getDireccion());
                    cliente.setDireccion(BitUtil.dameCadenaNoVacio("Nueva Dirección: ", 50));
                    algunCambio = true;
                    break;
                case 8:
                    System.out.println("Codigo Postal: " + cliente.getCodigoPostal());
                    cliente.setCodigoPostal(BitUtil.dameCadena("Nuevo Codigo postal: ", 5));
                    algunCambio = true;
                    break;
                case 9:
                    System.out.println("Localidad: " + cliente.getLocalidad());
                    cliente.setLocalidad(BitUtil.dameCadenaNoVacio("Nueva Localidad: ", 30));
                    algunCambio = true;
                    break;
                case 10:
                    System.out.println("Fecha Nacimiento: " + cliente.getNacimiento());
                    cliente.setNacimiento(BitUtil.dameFechaNoVacio("Nueva Fecha nacimiento (dia/Mes/año): "));
                    algunCambio = true;
                    break;
                case 11:
                    System.out.println("Sexo: " + cliente.getSexo());
                    cliente.setSexo(BitUtil.dameSexo("Nuevo Sexo: (Hombre/Mujer): "));
                    algunCambio = true;
                    break;
                case 12:
                    System.out.println("Fecha Alta: " + cliente.getFechaAlta());
                    cliente.setFechaAlta(BitUtil.dameFechaNoVacio("Nuevo Fecha Alta (dia/Mes/año): "));
                    algunCambio = true;
                    break;
                case 13:
                    cliente.setPassword(BitUtil.dameCadenaNoVacio("Nuevo Password: ", 10));
                    algunCambio = true;
                    break;
            }
        } while (respuesta != 0);

        if (algunCambio) {
            BitUtil.borra();
            System.out.println(cliente.toString());
            System.out.println("\n");
            boolean confirmar = BitUtil.dameConfirmacion("Desea guardar estos cambios? (S/N) ");
            if (confirmar) {
                cliente.actualizar();
            } else {
                //Si no aceptamos los cambios debemos recuperar el objeto sin cambios
                return copia;
            }
        }
        return cliente;
    }

    /**
     * Muestra una lista de los alquileres de un cliente
     * @param cliente
     */
    public static void opcionClientesVerAlquileres(Cliente cliente) {
        boolean hayAlguno=false;
        List<Alquiler> listAlquiler = Alquiler.seleccionarAlquilerCliente(cliente);

        BitUtil.borra();
        System.out.println(cliente.toStringLinea());

        if (listAlquiler.isEmpty()) {
            System.out.println("No hay ningun alquiler activo.\n");
        } else {
            String texto = "";
            for (Alquiler alquiler : listAlquiler) {
                if (!alquiler.getListArticulos().isEmpty()) {
                    texto += "     Alquiler: " + BitUtil.muestraFecha(alquiler.getFechaAlquiler()) + "\n";
                    for (ArticuloAlquilado articuloAlquilado : alquiler.getListArticulos()) {
                        texto += "      - Devolucion: " + BitUtil.muestraFecha(articuloAlquilado.getFechaEntrega()) + ", " + articuloAlquilado.getArticulo().getTitulo() + "\n";
                        hayAlguno=true;
                    }
                }
            }
            if(hayAlguno){
                System.out.println(texto);
            }else{
                System.out.println("No hay ningun alquiler activo.\n");
            }
        }
        BitUtil.esperaEnter();
    }

    /**
     * Da de baja un cliente o le da de alta si ya estaba de baja
     * @param cliente
     */
    public static void opcionClientesDarBaja(Cliente cliente) {
        boolean baja;

        BitUtil.borra();
        System.out.println(cliente.toStringLinea());
        System.out.println("\n");

        if (cliente.isActivo()) {
            baja = BitUtil.dameConfirmacion("Este cliente esta ACTIVO quiere darle de baja? (S/N) ");
            if (baja) {
                cliente.setFechaBaja(new Date());
                cliente.setActivo(false);
                cliente.actualizar();
                System.out.println("\nEl cliente ha sido dado de BAJA.\n");
                BitUtil.esperaEnter();
            }
        } else {
            baja = BitUtil.dameConfirmacion("Este cliente esta DE BAJA quiere darle de alta? (S/N) ");
            if (baja) {
                cliente.setActivo(true);
                cliente.setFechaBaja(null);
                cliente.actualizar();
                System.out.println("\nEl cliente ha sido dado de ALTA.\n");
                BitUtil.esperaEnter();
            }
        }

    }

    /**
     * Da de baja o de alta un cliente
     * @param cliente 
     */
    public static void opcionClientesIngresarSaldo(Cliente cliente) {
        BitUtil.borra();
        System.out.println(BitUtil.muestraSubrayado("Ingresar saldo", "-") + "\n");
        System.out.println("Saldo Actual: " + BitUtil.muestraEuros(cliente.getSaldo()));
        double cantidad = 0;
        boolean confirmar = false;
        do {
            cantidad = BitUtil.dameDouble("Ingresar: ");
        } while (cantidad <= 0);
        confirmar = BitUtil.dameConfirmacion("¿Desea confirmar saldo? (S/N)");
        if (confirmar) {
            cliente.setSaldo(cliente.getSaldo() + cantidad);
            cliente.actualizar();
            String concepto = cliente.getNombre() + " " + cliente.getApellidos() + " Recarga monedero: " + cantidad;
            Movimiento movimiento = new Movimiento(concepto, new Date(), 0);
            movimiento.nuevo();
        }
    }

    /**
     * Abre las opciones de búsqueda de clientes para poder efectuar acciones sobre ellos
     * PRINCIPAL > CLIENTES > BUSCAR
     */
    public static Cliente seleccionarCliente() {
        Cliente cliente = null;
        String nombre;
        int respuesta;

        do {
            BitUtil.borra();
            nombre = "";
            respuesta = BitUtil.muestraMenu("Seleccion de Cliente", new String[]{"Por DNI", "Por Nombre", "Todos"}, "No seleccionar ninguno");
            switch (respuesta) {
                case 1:
                    BitUtil.borra();
                    System.out.println(BitUtil.muestraSubrayado("Seleccion de Cliente", "-") + "\n");
                    String dni = BitUtil.dameEnteroFijo("Introduzca DNI: ", 8);
                    cliente = Cliente.seleccionarPorDni(dni);
                    if (cliente == null) {
                        System.out.println("\nNo hay clientes con dicho criterio.\n");
                        BitUtil.esperaEnter();
                    } else {
                        respuesta = 0;
                    }
                    break;
                case 2:
                    BitUtil.borra();
                    System.out.println(BitUtil.muestraSubrayado("Seleccion de Cliente", "-") + "\n");
                    nombre = BitUtil.dameCadena("Introduzca nombre: ", 20);
                case 3:
                    List<Cliente> clientes = (List) Cliente.seleccionarPorNombre(nombre);
                    if (clientes.isEmpty()) {
                        BitUtil.borra();
                        System.out.println(BitUtil.muestraSubrayado("Seleccion de Cliente", "-") + "\n");
                        System.out.println("No hay clientes con dicho criterio.\n");
                        BitUtil.esperaEnter();
                    } else {
                        String[] opciones = new String[clientes.size()];
                        for (int i = 0; i < clientes.size(); i++) {
                            opciones[i] = clientes.get(i).getNombre() + " " + clientes.get(i).getApellidos();
                        }
                        BitUtil.borra();
                        int seleccion = BitUtil.muestraMenu("Seleccion de Cliente", opciones, "Ninguno");
                        if (seleccion != 0) {
                            cliente = clientes.get(seleccion - 1);
                            respuesta = 0;
                        }
                    }
                    break;
            }
        } while (respuesta != 0);

        return cliente;
    }
}
